{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import sys\n",
    "\n",
    "from sklearn.metrics import mean_squared_error, mean_absolute_error, accuracy_score\n",
    "\n",
    "from src.loader import CumuloDataset\n",
    "from src.utils import make_directory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_dir = '../DATA/npz/label/'\n",
    "dataset = CumuloDataset(root_dir=data_dir, ext=\"npz\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1094, 117) (1094,)\n"
     ]
    }
   ],
   "source": [
    "xs = []\n",
    "ys = []\n",
    "\n",
    "for d in dataset:\n",
    "    xs.append(d[1]) # radiances\n",
    "    ys.append(d[4]) # labels\n",
    "\n",
    "shape = xs[0].shape\n",
    "xs = np.vstack(xs).reshape(-1, shape[1] * shape[2] * shape[3]) # flatten tiles\n",
    "ys = np.hstack(ys)\n",
    "\n",
    "print(xs.shape, ys.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0 7.0\n"
     ]
    }
   ],
   "source": [
    "print(min(ys), max(ys))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(765, 117) (765,) (110, 117) (110,) (219, 117) (219,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "train_xs, test_xs, train_ys, test_ys = train_test_split(xs, ys, test_size=0.20, random_state=42)\n",
    "\n",
    "train_xs, val_xs, train_ys, val_ys = train_test_split(train_xs, train_ys, test_size=0.125, random_state=42)\n",
    "\n",
    "print(train_xs.shape, train_ys.shape, val_xs.shape, val_ys.shape, test_xs.shape, test_ys.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import lightgbm as lgb\n",
    "\n",
    "lgb_train = lgb.Dataset(train_xs, train_ys)\n",
    "lgb_valid = lgb.Dataset(val_xs, val_ys)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "params = {\n",
    "    'boosting_type': 'gbdt',\n",
    "    'objective': 'multiclass',\n",
    "    'verbose': 0,\n",
    "    'num_classes': 8,\n",
    "    \"num_iterations\": 100,\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.5/dist-packages/lightgbm/engine.py:148: UserWarning: Found `num_iterations` in params. Will use it instead of argument\n",
      "  warnings.warn(\"Found `{}` in params. Will use it instead of argument\".format(alias))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1]\tvalid_0's multi_logloss: 1.43781\n",
      "[2]\tvalid_0's multi_logloss: 1.34706\n",
      "[3]\tvalid_0's multi_logloss: 1.26364\n",
      "[4]\tvalid_0's multi_logloss: 1.20397\n",
      "[5]\tvalid_0's multi_logloss: 1.14726\n",
      "[6]\tvalid_0's multi_logloss: 1.10386\n",
      "[7]\tvalid_0's multi_logloss: 1.0622\n",
      "[8]\tvalid_0's multi_logloss: 1.02746\n",
      "[9]\tvalid_0's multi_logloss: 0.998561\n",
      "[10]\tvalid_0's multi_logloss: 0.970639\n",
      "[11]\tvalid_0's multi_logloss: 0.946899\n",
      "[12]\tvalid_0's multi_logloss: 0.933115\n",
      "[13]\tvalid_0's multi_logloss: 0.918787\n",
      "[14]\tvalid_0's multi_logloss: 0.900433\n",
      "[15]\tvalid_0's multi_logloss: 0.88656\n",
      "[16]\tvalid_0's multi_logloss: 0.866991\n",
      "[17]\tvalid_0's multi_logloss: 0.856402\n",
      "[18]\tvalid_0's multi_logloss: 0.845481\n",
      "[19]\tvalid_0's multi_logloss: 0.834886\n",
      "[20]\tvalid_0's multi_logloss: 0.82451\n",
      "[21]\tvalid_0's multi_logloss: 0.811106\n",
      "[22]\tvalid_0's multi_logloss: 0.800759\n",
      "[23]\tvalid_0's multi_logloss: 0.791699\n",
      "[24]\tvalid_0's multi_logloss: 0.785686\n",
      "[25]\tvalid_0's multi_logloss: 0.779878\n",
      "[26]\tvalid_0's multi_logloss: 0.770358\n",
      "[27]\tvalid_0's multi_logloss: 0.765816\n",
      "[28]\tvalid_0's multi_logloss: 0.759562\n",
      "[29]\tvalid_0's multi_logloss: 0.75457\n",
      "[30]\tvalid_0's multi_logloss: 0.752131\n",
      "[31]\tvalid_0's multi_logloss: 0.746671\n",
      "[32]\tvalid_0's multi_logloss: 0.745672\n",
      "[33]\tvalid_0's multi_logloss: 0.742225\n",
      "[34]\tvalid_0's multi_logloss: 0.742265\n",
      "[35]\tvalid_0's multi_logloss: 0.7378\n",
      "[36]\tvalid_0's multi_logloss: 0.736974\n",
      "[37]\tvalid_0's multi_logloss: 0.73778\n",
      "[38]\tvalid_0's multi_logloss: 0.739493\n",
      "[39]\tvalid_0's multi_logloss: 0.737555\n",
      "[40]\tvalid_0's multi_logloss: 0.739607\n",
      "[41]\tvalid_0's multi_logloss: 0.736337\n",
      "[42]\tvalid_0's multi_logloss: 0.735617\n",
      "[43]\tvalid_0's multi_logloss: 0.737134\n",
      "[44]\tvalid_0's multi_logloss: 0.736401\n",
      "[45]\tvalid_0's multi_logloss: 0.736127\n",
      "[46]\tvalid_0's multi_logloss: 0.738108\n",
      "[47]\tvalid_0's multi_logloss: 0.739019\n",
      "[48]\tvalid_0's multi_logloss: 0.740747\n",
      "[49]\tvalid_0's multi_logloss: 0.742685\n",
      "[50]\tvalid_0's multi_logloss: 0.747912\n",
      "[51]\tvalid_0's multi_logloss: 0.750415\n",
      "[52]\tvalid_0's multi_logloss: 0.753005\n",
      "[53]\tvalid_0's multi_logloss: 0.757793\n",
      "[54]\tvalid_0's multi_logloss: 0.760705\n",
      "[55]\tvalid_0's multi_logloss: 0.765001\n",
      "[56]\tvalid_0's multi_logloss: 0.764577\n",
      "[57]\tvalid_0's multi_logloss: 0.768956\n",
      "[58]\tvalid_0's multi_logloss: 0.772464\n",
      "[59]\tvalid_0's multi_logloss: 0.777329\n",
      "[60]\tvalid_0's multi_logloss: 0.784684\n",
      "[61]\tvalid_0's multi_logloss: 0.787419\n",
      "[62]\tvalid_0's multi_logloss: 0.793083\n",
      "[63]\tvalid_0's multi_logloss: 0.793402\n",
      "[64]\tvalid_0's multi_logloss: 0.797786\n",
      "[65]\tvalid_0's multi_logloss: 0.801243\n",
      "[66]\tvalid_0's multi_logloss: 0.805892\n",
      "[67]\tvalid_0's multi_logloss: 0.810884\n",
      "[68]\tvalid_0's multi_logloss: 0.817082\n",
      "[69]\tvalid_0's multi_logloss: 0.824043\n",
      "[70]\tvalid_0's multi_logloss: 0.830175\n",
      "[71]\tvalid_0's multi_logloss: 0.835519\n",
      "[72]\tvalid_0's multi_logloss: 0.840351\n",
      "[73]\tvalid_0's multi_logloss: 0.840552\n",
      "[74]\tvalid_0's multi_logloss: 0.8437\n",
      "[75]\tvalid_0's multi_logloss: 0.851793\n",
      "[76]\tvalid_0's multi_logloss: 0.856617\n",
      "[77]\tvalid_0's multi_logloss: 0.858162\n",
      "[78]\tvalid_0's multi_logloss: 0.861215\n",
      "[79]\tvalid_0's multi_logloss: 0.867473\n",
      "[80]\tvalid_0's multi_logloss: 0.869679\n",
      "[81]\tvalid_0's multi_logloss: 0.878407\n",
      "[82]\tvalid_0's multi_logloss: 0.881269\n",
      "[83]\tvalid_0's multi_logloss: 0.884848\n",
      "[84]\tvalid_0's multi_logloss: 0.891882\n",
      "[85]\tvalid_0's multi_logloss: 0.89326\n",
      "[86]\tvalid_0's multi_logloss: 0.897578\n",
      "[87]\tvalid_0's multi_logloss: 0.90195\n",
      "[88]\tvalid_0's multi_logloss: 0.903445\n",
      "[89]\tvalid_0's multi_logloss: 0.905214\n",
      "[90]\tvalid_0's multi_logloss: 0.910708\n",
      "[91]\tvalid_0's multi_logloss: 0.917582\n",
      "[92]\tvalid_0's multi_logloss: 0.922409\n",
      "[93]\tvalid_0's multi_logloss: 0.926058\n",
      "[94]\tvalid_0's multi_logloss: 0.92808\n",
      "[95]\tvalid_0's multi_logloss: 0.931587\n",
      "[96]\tvalid_0's multi_logloss: 0.936352\n",
      "[97]\tvalid_0's multi_logloss: 0.942266\n",
      "[98]\tvalid_0's multi_logloss: 0.949121\n",
      "[99]\tvalid_0's multi_logloss: 0.952923\n",
      "[100]\tvalid_0's multi_logloss: 0.961133\n"
     ]
    }
   ],
   "source": [
    "gbm = lgb.train(params, lgb_train, valid_sets=[lgb_valid])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_prob_pred = gbm.predict(train_xs, num_iteration = gbm.best_iteration)\n",
    "val_prob_pred = gbm.predict(val_xs, num_iteration = gbm.best_iteration)\n",
    "test_prob_pred = gbm.predict(test_xs, num_iteration = gbm.best_iteration)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# take argmax of prediction probabilities\n",
    "train_y_pred = np.argmax(train_prob_pred, 1)\n",
    "val_y_pred = np.argmax(val_prob_pred, 1)\n",
    "test_y_pred = np.argmax(test_prob_pred, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7625570776255708\n"
     ]
    }
   ],
   "source": [
    "accuracy = accuracy_score(test_ys, test_y_pred)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "train_cm = confusion_matrix(train_ys, train_y_pred, labels=range(8))\n",
    "val_cm = confusion_matrix(val_ys, val_y_pred, labels=range(8))\n",
    "test_cm = confusion_matrix(test_ys, test_y_pred, labels=range(8))\n",
    "\n",
    "# np.save(\"train-confusion-matrix.npy\", train_cm)\n",
    "# np.save(\"test-confusion-matrix.npy\", test_cm)\n",
    "# np.save(\"val-confusion-matrix.npy\", val_cm)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def normalize_confusion_matrix(darray):\n",
    "    return (darray / np.sum(darray, 1, keepdims=True)).round(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/vale/.local/lib/python3.5/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in true_divide\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[Text(946.764705882353, 0.5, 'target'), Text(0.5, 24.0, 'predicted')]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x360 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sn\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline\n",
    "\n",
    "# best model, batch weights\n",
    "train_cm, val_cm, test_cm = normalize_confusion_matrix(train_cm), normalize_confusion_matrix(val_cm), normalize_confusion_matrix(test_cm)\n",
    "\n",
    "plt.figure(figsize = (20,5))\n",
    "\n",
    "plt.subplot(131)\n",
    "\n",
    "df_cm = pd.DataFrame(train_cm, index = range(8), columns = range(8))\n",
    "\n",
    "plt.title(\"TRAIN\")\n",
    "ax = sn.heatmap(df_cm, annot=True, vmin=0, vmax=1)\n",
    "ax.set(xlabel='predicted', ylabel='target')\n",
    "\n",
    "plt.subplot(132)\n",
    "\n",
    "df_cm = pd.DataFrame(val_cm, index = range(8), columns = range(8))\n",
    "\n",
    "plt.title(\"VAL\")\n",
    "ax = sn.heatmap(df_cm, annot=True, vmin=0, vmax=1)\n",
    "ax.set(xlabel='predicted', ylabel='target')\n",
    "\n",
    "plt.subplot(133)\n",
    "\n",
    "df_cm = pd.DataFrame(test_cm, index = range(8), columns = range(8))\n",
    "\n",
    "plt.title(\"TEST\")\n",
    "ax = sn.heatmap(df_cm, annot=True, vmin=0, vmax=1)\n",
    "ax.set(xlabel='predicted', ylabel='target')\n",
    "\n",
    "# plt.savefig(\"lightgbm-confusion-matrices.png\", bboxes=\"tight\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<lightgbm.basic.Booster at 0x7f33490a4710>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "make_directory(\"results/lgbm/\")\n",
    "gbm.save_model(\"results/lgbm/lightgbm-model.txt\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
